package com.zhibang.config;

import com.zhibang.entity.Account;
import com.zhibang.mapper.AccountMapper;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import javax.annotation.Resource;
import java.util.List;

/**
 * 认证授权配置类
 **/
public class MysqlRealm extends AuthorizingRealm {
    @Resource
    AccountMapper am;
    // 授权方法  每次鉴权都会执行本方法
    // 配置缓存后 仅执行一次
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection p) {
        // 拿到当前登录的用户名
        Account user = (Account) p.getPrimaryPrincipal();
        // 查询角色与权限
        List<String> roles = am.getRoles(user.getAccount());
        System.out.println(user.getAccount()+"具有角色:"+roles);
        // 创建授权对象
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addRoles(roles); // 授予角色
        return info;
    }


    // 认证方法  每次登录时会执行本方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken au) throws AuthenticationException {
        // 获取登录时的账户
        String username = (String) au.getPrincipal();
        // 查询该用户
        Account user = am.getUsers(username);
        // 判断账户是否存在
        if(user == null){
            throw new UnknownAccountException();
        }
        // 判断账户是否锁定
        if(user.getState() == 1){
            throw new LockedAccountException();
        }
        // 返回认证对象与登录的密码比对
        // 获取数据库的盐
        ByteSource salt = ByteSource.Util.bytes(user.getSalt());
        /**
         * 参1：登录后要存储的信息
         * 参2：登录用于比较的密码
         * 参3：当前域的名称
         */
        SimpleAuthenticationInfo info =
                new SimpleAuthenticationInfo(
                   user,user.getPassword(),salt,getName());
        return info;
    }
}
